
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Vector3 Class (Vector3.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	All 3D shapes can use Vector3 to represent data E.g.: Position, Direction, Size,etc
* =========================================================================================
*/
#pragma endregion


#ifndef VECTOR3_H_
#define VECTOR3_H_

namespace Physics
{
	class Vector3
	{
	private:
		//DATA MEMBERS...
		float x, y, z;

	public:
		//---------- CONSTRUCTORS ----------
		Vector3(): x(0), y(0), z(0) {}							//C001: Inline Default Constructor
		Vector3(float X, float Y, float Z): x(X), y(Y), z(Z) {}	//C002: Inline Overloaded Constructor
		Vector3(const Vector3 &vec);							//C003: Copy Constructor

		virtual ~Vector3() { }									//C004: EMPTY Virtual Destructor, in case this class is inherited later


		//---------- PROPERTIES ----------
		void setX(const float &x);								//M001: Setter X-value
		float getX() const;										//M002: Getter X-value

		void setY(const float &y);								//M003: Setter Y-value
		float getY() const;										//M004: Getter Y-value

		void setZ(const float &z);								//M005: Setter Z-value
		float getZ() const;										//M006: Getter Z-value

		void setXYZ(const float &x, const float &y, const float &z); //M007: Setter XYZ-value
		void setXYZ(const Vector3 &vec);						//M008: Setter XYZ-value
		const Vector3& getXYZ() const;							//M009: Getter XYZ-value

		//---------- OVERLOADED OPERATORS ----------
		const Vector3 operator+(const Vector3 &vec);			//M010: 
		const Vector3 operator-(const Vector3 &vec);			//M011: 
		const Vector3 operator*(const Vector3 &vec);			//M012: 
		const Vector3& operator=(const Vector3 &vec);			//M013: Assignment Operator
		bool operator==(const Vector3 &vec);					//M014: 
		//subscript ( [] ) operator for arrays					//M015: Not needed, this class does not have any arrays....

		float findDistance(Vector3 const &vec);					//M016: Distance Method

		float dotProduct(Vector3 const &vec);					//M017: Get Dot Product

		float magnitude();										//M018: Get length/magnitude of the vector

		void normalize();										//M019: Normalize the vector

		Vector3 crossProduct(Vector3 const &vec);				//M020: Find Cross Product between 2 vectors
		
		//---------- HELPER METHODS ----------
		const Vector3 zero() const;								//M021: Helper Method, Return ZERO-value

		
	};
} /* NAMESPACE */

#endif
